home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #9 / Amiga Plus CD - 2004 - No. 09.iso / amigaplus / tools / dev_libs / feelin040718 / sources / shade / area.c next >
C/C++ Source or Header  |  2004-08-03  |  10KB  |  355 lines

  1. #include "Private.h"
  2.  
  3. /*** Private ***************************************************************/
  4.  
  5. static UBYTE defascheme[] = "s:1,s:3,s:7,s:7,s:8";
  6. static UBYTE defischeme[] = "s:3,s:4,s:5,s:6,s:7";
  7.  
  8. SAVEDS void Shade_DrawActive(struct FeelinClass *Class,APTR Obj,ULONG Flags);
  9. SAVEDS void Shade_DrawInactive(struct FeelinClass *Class,APTR Obj,ULONG Flags);
  10.  
  11. /*** Methods ***************************************************************/
  12.  
  13. ///Shade_Setup
  14. F_METHODM(ULONG,Shade_Setup,FS_Setup)
  15. {
  16.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  17.  
  18.    FObject win = Msg -> Render -> Window;
  19.    ULONG data;
  20.  
  21.    data = F_Do(Msg -> Render -> Application,FM_Application_Resolve,"FP_Decorator_AScheme",defascheme);
  22.    if (!(LOD -> AScheme = (struct FeelinPalette *) F_Do(Msg -> Render -> Display,FM_CreateColorScheme,data,F_Get(_parent,FA_ColorScheme)))) return FALSE;
  23.  
  24.    data = F_Do(Msg -> Render -> Application,FM_Application_Resolve,"FP_Decorator_IScheme",defischeme);
  25.    if (!(LOD -> IScheme = (struct FeelinPalette *) F_Do(Msg -> Render -> Display,FM_CreateColorScheme,data,F_Get(_parent,FA_ColorScheme)))) return FALSE;
  26.  
  27. /// Gadgets
  28.    if (F_Get(win,FA_Window_GadClose))
  29.    {
  30.       if (LOD -> Gad_Close = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Close,FA_ContextHelp,"Close Window",TAG_DONE))
  31.       {
  32.          F_Do(Obj,FM_AddMember,LOD -> Gad_Close,FV_AddMember_Tail);
  33.       }
  34.       else return FALSE;
  35.    }
  36.  
  37.    if (!(FF_SHADE_ZOOM_IS_ICONIFY & LOD -> Flags))
  38.    {
  39.       if (F_Get(win,FA_Window_GadIconify))
  40.       {
  41.          if (LOD -> Gad_Iconify = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Iconify,FA_ContextHelp,"Iconify Application",TAG_DONE))
  42.          {
  43.             F_Do(Obj,FM_AddMember,LOD -> Gad_Iconify,FV_AddMember_Tail);
  44.          }
  45.          else return FALSE;
  46.       }
  47.    }
  48.  
  49.    if (F_Get(win,FA_Window_GadDragbar))
  50.    {
  51.       if (LOD -> Gad_Dragbar = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Dragbar,FA_ContextHelp,"Drag Window",TAG_DONE))
  52.       {
  53.          F_Do(Obj,FM_AddMember,LOD -> Gad_Dragbar,FV_AddMember_Tail);
  54.       }
  55.       else return FALSE;
  56.    }
  57.  
  58.    if (F_Get(win,FA_Window_Resizable))
  59.    {
  60.       if (LOD -> Gad_Zoom = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Zoom,FA_ContextHelp,"Zoom Window",TAG_DONE))
  61.       {
  62.          F_Do(Obj,FM_AddMember,LOD -> Gad_Zoom,FV_AddMember_Tail);
  63.  
  64.          if (LOD -> Gad_Size = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Size,FA_ContextHelp,"Resize Window",TAG_DONE))
  65.          {
  66.             F_Do(Obj,FM_AddMember,LOD -> Gad_Size,FV_AddMember_Tail);
  67.          }
  68.          else return FALSE;
  69.       }
  70.       else return FALSE;
  71.    }
  72.  
  73.    if (F_Get(win,FA_Window_GadDepth))
  74.    {
  75.       if (LOD -> Gad_Depth = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Depth,FA_ContextHelp,"Depth arrange Window",TAG_DONE))
  76.       {
  77.          F_Do(Obj,FM_AddMember,LOD -> Gad_Depth,FV_AddMember_Tail);
  78.       }
  79.       else return FALSE;
  80.    }
  81.  
  82. //+
  83.  
  84.    /* Gadgets must be linked to the decorator BEFORE passing the method  to
  85.    the superclass, otherwise children won't be setuped. */
  86.  
  87.    if (F_SUPERDO())
  88.    {
  89.       LOD -> nn_window_active = (FNotifyHandler *) F_Do(_win,FM_Notify,FA_Window_Active,FV_Notify_Always,Obj,FM_Set,2,FA_Active,FV_Notify_Value);
  90.       LOD -> nn_window_title  = (FNotifyHandler *) F_Do(_win,FM_Notify,FA_Window_Title, FV_Notify_Always,LOD -> Gad_Dragbar,FM_Draw,1,FF_Draw_Object);
  91.  
  92.       LOD -> GadW = _font -> tf_YSize + _font -> tf_YSize / 3;
  93.       LOD -> GadH = _font -> tf_YSize;
  94.  
  95.       _bl = 2 + TICKNESS;
  96.       _br = 2 + TICKNESS;
  97.       _bb = 2 + TICKNESS;
  98.  
  99.       if (LOD -> Gad_Dragbar)
  100.       {
  101.          _bt = 2 + MAX(_font -> tf_YSize,LOD -> GadH + TITLEY1 + TITLEY2);
  102.       }
  103.       else
  104.       {
  105.          _bt = 2 + TICKNESS;
  106.       }
  107.  
  108.       return TRUE;
  109.    }
  110.    return FALSE;
  111. }
  112. //+
  113. ///Shade_Cleanup
  114. F_METHOD(void,Shade_Cleanup)
  115. {
  116.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  117.  
  118.    FObject gad;
  119.  
  120.    if (_render)
  121.    {
  122.       F_Do(_win,FM_UnNotify,LOD -> nn_window_active); LOD -> nn_window_active = NULL;
  123.       F_Do(_win,FM_UnNotify,LOD -> nn_window_title);  LOD -> nn_window_title  = NULL;
  124.  
  125.       if (LOD -> AScheme)
  126.       {
  127.          F_Do(_display,FM_DeleteColorScheme,LOD -> AScheme); LOD -> AScheme = NULL;
  128.       }
  129.       if (LOD -> IScheme)
  130.       {
  131.          F_Do(_display,FM_DeleteColorScheme,LOD -> IScheme); LOD -> IScheme = NULL;
  132.       }
  133.    }
  134.  
  135.    F_SUPERDO();
  136.  
  137.    while (gad = (FObject) F_Get(Obj,FA_Group_Tail))
  138.    {
  139.       F_DisposeObj(gad);
  140.    }
  141. }
  142. //+
  143. ///Shade_Layout
  144. #define area_class_offset                       FC_Area_Offset
  145. #define _gad_init                               FAreaData * gad_area_data = (FAreaData *)((ULONG)(gad) + area_class_offset)
  146. #define _gad_box                                (gad_area_data -> Box)
  147. #define _gad_x                                  (_gad_box.x)
  148. #define _gad_y                                  (_gad_box.y)
  149. #define _gad_w                                  (_gad_box.w)
  150. #define _gad_h                                  (_gad_box.h)
  151.  
  152. F_METHOD(void,Shade_Layout)
  153. {
  154.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  155.  
  156.    WORD  x1 = _x + 1,
  157.          y1 = _y + 1,
  158.          x2 = _x2;
  159.  
  160.    FObject gad;
  161.  
  162.    LOD -> LastDrawn = FV_Shade_LastDrawn_None;
  163.  
  164.    if (F_Get(_win,FA_Window_Resizable))
  165.    {
  166.       if (!LOD -> Gad_Zoom || !LOD -> Gad_Size)
  167.       {
  168.          if (LOD -> Gad_Zoom = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Zoom,FA_ContextHelp,"Zoom Window",TAG_DONE))
  169.          {
  170.             F_Do(Obj,FM_AddMember,LOD -> Gad_Zoom,FV_AddMember_Tail);
  171.  
  172.             if (LOD -> Gad_Size = F_NewObj(GadgetClass -> Name,FA_Gadget_Type,FV_GadgetType_Size,FA_ContextHelp,"Resize Window",TAG_DONE))
  173.             {
  174.                F_Do(Obj,FM_AddMember,LOD -> Gad_Size,FV_AddMember_Tail);
  175.             }
  176. //            else return FALSE;
  177.          }
  178. //         else return FALSE;
  179.       }
  180.    }
  181.    else if (LOD -> Gad_Zoom || LOD -> Gad_Size)
  182.    {
  183.       F_DisposeObj(LOD -> Gad_Size); LOD -> Gad_Size = NULL;
  184.       F_DisposeObj(LOD -> Gad_Zoom); LOD -> Gad_Zoom = NULL;
  185.    }
  186.  
  187.  
  188.    if (LOD -> Gad_Dragbar)
  189.    {
  190.       if (!LOD -> Gad_Close && !LOD -> Gad_Iconify)
  191.       {
  192.          x1 += TICKNESS;
  193.       }
  194.       else
  195.       {
  196.          if (gad = LOD -> Gad_Close)
  197.          {
  198.             _gad_init;
  199.  
  200.             _gad_x = x1 + TICKNESS;
  201.             _gad_y = y1 + TITLEY1;
  202.             _gad_w = LOD -> GadW;
  203.             _gad_h = LOD -> GadH;
  204.  
  205.             x1 = TICKNESS * 2 + x1 + LOD -> GadW;
  206.  
  207.             F_Do(gad,FM_Layout);
  208.          }
  209.  
  210.          if (gad = LOD -> Gad_Iconify)
  211.          {
  212.             _gad_init;
  213.  
  214.             _gad_x = x1 + TICKNESS;
  215.             _gad_y = y1 + TITLEY1;
  216.             _gad_w = LOD -> GadW;
  217.             _gad_h = LOD -> GadH;
  218.  
  219.             x1 = TICKNESS * 2 + x1 + LOD -> GadW;
  220.  
  221.             F_Do(gad,FM_Layout);
  222.          }
  223.       }
  224.  
  225.       if (!LOD -> Gad_Zoom && !LOD -> Gad_Depth)
  226.       {
  227.          x2 -= TICKNESS;
  228.       }
  229.       else
  230.       {
  231.          if (gad = LOD -> Gad_Depth)
  232.          {
  233.             _gad_init;
  234.  
  235.             _gad_x = x2 - TICKNESS - LOD -> GadW;
  236.             _gad_y = y1 + TITLEY1;
  237.             _gad_w = LOD -> GadW;
  238.             _gad_h = LOD -> GadH;
  239.  
  240.             x2 = x2 - (TICKNESS * 2) - LOD -> GadW;
  241.  
  242.             F_Do(gad,FM_Layout);
  243.          }
  244.  
  245.          if (gad = LOD -> Gad_Zoom)
  246.          {
  247.             _gad_init;
  248.  
  249.             _gad_x = x2 - TICKNESS - LOD -> GadW;
  250.             _gad_y = y1 + TITLEY1;
  251.             _gad_w = LOD -> GadW;
  252.             _gad_h = LOD -> GadH;
  253.  
  254.             x2 = x2 - (TICKNESS * 2) - LOD -> GadW;
  255.  
  256.             F_Do(gad,FM_Layout);
  257.          }
  258.       }
  259.    }
  260.  
  261.    if (gad = LOD -> Gad_Size)
  262.    {
  263.       _gad_init;
  264.       _gad_x = _x2 - SIZE + 1; _gad_w = SIZE - 1;
  265.       _gad_y = _y2 - SIZE + 1; _gad_h = SIZE - 1;
  266.  
  267.       F_Do(gad,FM_Layout);
  268.    }
  269.  
  270.    if ((x2 - x1 - 2) < 0)
  271.    {
  272.       F_Set(LOD -> Gad_Close,FA_Hidden,TRUE);
  273.       F_Set(LOD -> Gad_Iconify,FA_Hidden,TRUE);
  274.       F_Set(LOD -> Gad_Zoom,FA_Hidden,TRUE);
  275.       F_Set(LOD -> Gad_Depth,FA_Hidden,TRUE);
  276.  
  277.       if (gad = LOD -> Gad_Dragbar)
  278.       {
  279.          _gad_init;
  280.  
  281.          _gad_x = _x + TICKNESS + 2;
  282.          _gad_y = y1;
  283.          _gad_w = _w - TICKNESS * 2 - 4;
  284.          _gad_h = LOD -> GadH + TITLEY1 + TITLEY2;
  285.  
  286.          F_Do(gad,FM_Layout);
  287.       }
  288.    }
  289.    else
  290.    {
  291.       F_Set(LOD -> Gad_Close,FA_Hidden,FALSE);
  292.       F_Set(LOD -> Gad_Iconify,FA_Hidden,FALSE);
  293.       F_Set(LOD -> Gad_Zoom,FA_Hidden,FALSE);
  294.       F_Set(LOD -> Gad_Depth,FA_Hidden,FALSE);
  295.  
  296.       if (gad = LOD -> Gad_Dragbar)
  297.       {
  298.          _gad_init;
  299.  
  300.          _gad_x = x1 + 1;
  301.          _gad_y = y1;
  302.          _gad_w = x2 - x1 - 2;
  303.          _gad_h = LOD -> GadH + TITLEY1 + TITLEY2;
  304.  
  305.          F_Do(gad,FM_Layout);
  306.       }
  307.    }
  308. }
  309. //+
  310. ///Shade_Show
  311. F_METHOD(ULONG,Shade_Show)
  312. {
  313.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  314.  
  315.    LOD -> LastDrawn = FV_Shade_LastDrawn_None;
  316.  
  317.    if (_render)
  318.    {
  319.       struct Window *osw;
  320.  
  321.       F_Set(Obj,FA_Active,F_Get(_win,FA_Window_Active));
  322.  
  323.       if (osw = (APTR) F_Get(_win,FA_Window))
  324.       {
  325.          if (LOD -> Gad_Close) osw -> Flags |= WFLG_CLOSEGADGET;
  326.          if (LOD -> Gad_Zoom)  osw -> Flags |= WFLG_HASZOOM;
  327.       }
  328.    }
  329.    return F_SUPERDO();
  330. }
  331. //+
  332. ///Shade_Draw
  333. F_METHODM(void,Shade_Draw,FS_Draw)
  334. {
  335.    if (FF_Draw_Object & Msg -> Flags)
  336.    {
  337.       if (F_Get(Obj,FA_Active))  Shade_DrawActive  (Class,Obj,Msg -> Flags);
  338.       else                       Shade_DrawInactive(Class,Obj,Msg -> Flags);
  339.    }
  340. }
  341. //+
  342. ///Shade_GoActive
  343. F_METHOD(void,Shade_GoActive)
  344. {
  345.    F_Draw(Obj,FF_Draw_Object);
  346. }
  347. //+
  348. ///Shade_GoInactive
  349. F_METHOD(void,Shade_GoInactive)
  350. {
  351.    F_Draw(Obj,FF_Draw_Object);
  352. }
  353. //+
  354.  
  355.